package ar.com.age.distribuidora.presentacion.controller;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.Empleado;
import ar.com.age.distribuidora.dominio.Localidad;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class EmpleadoBean {

	private String nombreRegistrar;
	
	private String apellidoRegistrar;
	
	private String codigoRegistrar;
	
	private String contraseniaRegistrar;
	
	private String telefonoRegistrar;
	
	private String direccionRegistrar;
	
	private String tipoRegistrar;
	
	private String comentarioRegistrar;
	
	private Localidad localidadSeleccionadaRegistrar;
	
	private List<Localidad> localidades;
	
	private Empleado empleadoSeleccionado;  
    
    private Empleado empleadoSeleccionadoDetalles;  

	private String codigoBuscar;
	
	private String nombreBuscar;
	
	private String apellidoBuscar;
	
	private String estadoBuscar;
	
	private String tipoBuscar;
	
	private List<Empleado> empleados;
	
	private Localidad localidadAux;
	
	private String nombreLocalidad;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;
	
    
	public EmpleadoBean() {

		ValidadorTipoUsuario.validarAdministrador();
		
		this.localidades = ServiceLocator.getLocalidadService().buscarTodos();

		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		this.panelBuscarVisibilidad = false;

	}

	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public Localidad getLocalidadAux() {
		return localidadAux;
	}


	public void setLocalidadAux(Localidad localidadAux) {
		this.localidadAux = localidadAux;
	}


	public String getNombreLocalidad() {
		return nombreLocalidad;
	}


	public void setNombreLocalidad(String nombreLocalidad) {
		this.nombreLocalidad = nombreLocalidad;
	}


	public String getNombreRegistrar() {
		return nombreRegistrar;
	}

	public void setNombreRegistrar(String nombreRegistrar) {
		this.nombreRegistrar = nombreRegistrar;
	}

	public String getApellidoRegistrar() {
		return apellidoRegistrar;
	}

	public void setApellidoRegistrar(String apellidoRegistrar) {
		this.apellidoRegistrar = apellidoRegistrar;
	}

	public String getCodigoRegistrar() {
		return codigoRegistrar;
	}

	public void setCodigoRegistrar(String codigoRegistrar) {
		this.codigoRegistrar = codigoRegistrar;
	}

	public String getContraseniaRegistrar() {
		return contraseniaRegistrar;
	}

	public void setContraseniaRegistrar(String contraseniaRegistrar) {
		this.contraseniaRegistrar = contraseniaRegistrar;
	}

	public Localidad getLocalidadSeleccionadaRegistrar() {
		return localidadSeleccionadaRegistrar;
	}

	public void setLocalidadSeleccionadaRegistrar(
			Localidad localidadSeleccionadaRegistrar) {
		this.localidadSeleccionadaRegistrar = localidadSeleccionadaRegistrar;
	}

	public List<Localidad> getLocalidades() {
		return localidades;
	}

	public void setLocalidades(List<Localidad> localidades) {
		this.localidades = localidades;
	}

	public Empleado getEmpleadoSeleccionado() {
		return empleadoSeleccionado;
	}

	public void setEmpleadoSeleccionado(Empleado empleadoSeleccionado) {
		this.empleadoSeleccionado = empleadoSeleccionado;
	}

	public Empleado getEmpleadoSeleccionadoDetalles() {
		return empleadoSeleccionadoDetalles;
	}

	public void setEmpleadoSeleccionadoDetalles(Empleado empleadoSeleccionadoDetalles) {
		this.empleadoSeleccionadoDetalles = empleadoSeleccionadoDetalles;
	}

	public String getCodigoBuscar() {
		return codigoBuscar;
	}

	public void setCodigoBuscar(String codigoBuscar) {
		this.codigoBuscar = codigoBuscar;
	}

	public String getNombreBuscar() {
		return nombreBuscar;
	}

	public void setNombreBuscar(String nombreBuscar) {
		this.nombreBuscar = nombreBuscar;
	}

	public String getApellidoBuscar() {
		return apellidoBuscar;
	}

	public void setApellidoBuscar(String apellidoBuscar) {
		this.apellidoBuscar = apellidoBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public List<Empleado> getEmpleados() {
		return empleados;
	}

	public void setEmpleados(List<Empleado> empleados) {
		this.empleados = empleados;
	}
	
	public String getTelefonoRegistrar() {
		return telefonoRegistrar;
	}

	public void setTelefonoRegistrar(String telefonoRegistrar) {
		this.telefonoRegistrar = telefonoRegistrar;
	}

	public String getDireccionRegistrar() {
		return direccionRegistrar;
	}

	public void setDireccionRegistrar(String direccionRegistrar) {
		this.direccionRegistrar = direccionRegistrar;
	}

	public String getTipoRegistrar() {
		return tipoRegistrar;
	}

	public void setTipoRegistrar(String tipoRegistrar) {
		this.tipoRegistrar = tipoRegistrar;
	}

	public String getComentarioRegistrar() {
		return comentarioRegistrar;
	}

	public void setComentarioRegistrar(String comentarioRegistrar) {
		this.comentarioRegistrar = comentarioRegistrar;
	}

	public String getTipoBuscar() {
		return tipoBuscar;
	}

	public void setTipoBuscar(String tipoBuscar) {
		this.tipoBuscar = tipoBuscar;
	}

	
	// Metodos del Bean

	public String registrarEmpleado() {
		
		Empleado empleado = new Empleado();
		empleado.setApellido(apellidoRegistrar);
		empleado.setCodigo(codigoRegistrar);
		empleado.setContrasenia(contraseniaRegistrar);
		empleado.setEstado("Activo");
		empleado.setNombre(nombreRegistrar);
		empleado.setComentario(comentarioRegistrar);
		empleado.setTelefono(telefonoRegistrar);
		empleado.setTipo(tipoRegistrar);
		empleado.setDireccion(direccionRegistrar);

		if(tipoRegistrar.equals("Venta"))
			empleado.setTipoUsuario("EV");
		else
			empleado.setTipoUsuario("EC");

		empleado.setLocalidad(this.localidadSeleccionadaRegistrar);
		
		ServiceLocator.getUsuarioService().crearOEditarEmpleado(empleado);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		apellidoRegistrar = null;
		codigoRegistrar = null;
		contraseniaRegistrar = null;
		nombreRegistrar = null;
		localidadSeleccionadaRegistrar = null;
		tipoRegistrar = null;
		direccionRegistrar = null;
		telefonoRegistrar = null;
		comentarioRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarEmpleado() {
		
		if (this.empleadoSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Empleado",  "Empleado editado con exito.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);

	        if (this.empleadoSeleccionado.getLocalidad() == null) {
	        	this.empleadoSeleccionado.setLocalidad(this.localidadAux);
			}
	        
	        if(empleadoSeleccionado.getTipo().equals("Venta"))
	        	empleadoSeleccionado.setTipoUsuario("EV");
			else
				empleadoSeleccionado.setTipoUsuario("EC");
	        
			ServiceLocator.getUsuarioService().crearOEditarEmpleado(this.empleadoSeleccionado);
			this.empleadoSeleccionado = null;
			
			// para reestablecer los valores
			localidadAux = null;
			nombreLocalidad = null;
			// para volver a setear la lista con todas las ciudades
			this.localidades = ServiceLocator.getLocalidadService().buscarTodos();
			
			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;
		 
			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Empleado",  "No se ha seleccionado un empleado.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarEmpleado() {
		
		if (empleadoSeleccionado != null) {
			
			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			localidadAux = empleadoSeleccionado.getLocalidad();
			nombreLocalidad = empleadoSeleccionado.getLocalidad().getNombre();
			
			//para eliminar la localidad que tenia... asi no aparece dos veces
			for(int i = 0; i < localidades.size(); i++){
				if (localidadAux.getNombre().equals(localidades.get(i).getNombre())) {
					localidades.remove(i);
				}
			}
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarEmpleado() {
		
		if (this.empleadoSeleccionado != null) {

			try {
				ServiceLocator.getUsuarioService().eliminarEmpleado(this.empleadoSeleccionado);
			} catch (Exception e) {

				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
				RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}			

			this.empleadoSeleccionado = null;
			this.empleados = ServiceLocator.getUsuarioService().buscarEmpleado(codigoBuscar, apellidoBuscar, nombreBuscar, estadoBuscar, tipoBuscar);

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarEmpleado() {
		
		this.empleados = ServiceLocator.getUsuarioService().buscarEmpleado(codigoBuscar, apellidoBuscar, nombreBuscar, estadoBuscar, tipoBuscar);

		if (this.empleados != null && !this.empleados.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		this.empleados = ServiceLocator.getUsuarioService().buscarEmpleado(codigoBuscar, apellidoBuscar, nombreBuscar, estadoBuscar, tipoBuscar);
	}
}
